package gui;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.ListSelectionModel;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.ArrayList;

import javax.swing.border.TitledBorder;
import javax.swing.JComboBox;

import negocio.Area;
import negocio.AreaControlador;
import negocio.Cursada;
import negocio.CursadaControlador;
import negocio.Curso;
import negocio.CursoControlador;
import negocio.Inscripcion;
import negocio.InscripcionControlador;
import negocio.Usuario;
import negocio.UsuarioControlador;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Cursadas extends JFrame {

        private JPanel contentPane;
        private JTextField txtCodigo;
        private JTextField txtAlumno;
        private JTable table;
        private Cursadas padreCursadas;
        private CursadasCrear cursadasCrear= null;
        private CursadasExaminar cursadasExaminar=null;
        private NotasYExamenes notasYExamenes=null;
        private Clases clasesExaminar = null;
 
        Usuario usuario;
        DefaultTableModel tm = new DefaultTableModel();
        
        private ArrayList<Cursada> cursadas;
        private JComboBox comboCurso;
        private JComboBox comboArea;
        private JComboBox comboResponsable;
        private JComboBox comboInstructores;
        private AsignarInstructor asignarInstructor = null;
		private AsignarResponsable asignarResponsable = null;
        private JComboBox comboEstado;

        
        
        public void nullCursadasCrear()
        {
                cursadasCrear=null;
        }
        
        public void nullCursadasExaminar()
        {
                cursadasExaminar=null;
                
        }
       
        
        public void nullNotasYExamenes()
        {
                notasYExamenes=null;
        }
        
        public void nullClasesExaminar()
        {
                this.clasesExaminar = null;
        }
        
        public void nullAsignarInstructor()
        {
        	this.asignarInstructor=null;
        }
        
        public void nullAsignarResponsable()
        {
			this.asignarResponsable=null;	
		}
        

       
        public Cursadas(Principal padre, Usuario usuario) {
                addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e){
                                padre.nullCursadas();
                        }
                });
                

                this.usuario=usuario;
                padreCursadas=this;
                setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                setBounds(270, 220, 800, 500);
                this.setTitle("Cursadas");
                contentPane = new JPanel();
                contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
                setContentPane(contentPane);
                contentPane.setLayout(null);
                
                JPanel panel = new JPanel();
                panel.setBorder(new TitledBorder(null, "Busqueda", TitledBorder.LEADING, TitledBorder.TOP, null, null));
                panel.setBounds(10, 17, 765, 105);
                contentPane.add(panel);
                panel.setLayout(null);
                
                JLabel lblCodigoCursada = new JLabel("Codigo Cursada");
                lblCodigoCursada.setBounds(6, 19, 83, 14);
                panel.add(lblCodigoCursada);
                
                txtCodigo = new JTextField();
                txtCodigo.setBounds(99, 16, 153, 20);
                panel.add(txtCodigo);
                txtCodigo.setColumns(10);
                
                JLabel lblAlumno = new JLabel("Alumno");
                lblAlumno.setBounds(6, 46, 46, 14);
                panel.add(lblAlumno);
                
                txtAlumno = new JTextField();
                txtAlumno.setBounds(99, 43, 153, 20);
                panel.add(txtAlumno);
                txtAlumno.setColumns(10);
                
                JLabel lblInstructor = new JLabel("Instructor");
                lblInstructor.setBounds(262, 46, 83, 14);
                panel.add(lblInstructor);
                
                comboInstructores = new JComboBox();
                comboInstructores.setBounds(352, 43, 153, 20);
                panel.add(comboInstructores);
                
                JLabel lblCurso = new JLabel("Curso");
                lblCurso.setBounds(262, 19, 46, 14);
                panel.add(lblCurso);
                
                comboCurso = new JComboBox();
                comboCurso.setBounds(352, 16, 153, 20);
                panel.add(comboCurso);
                
                JLabel lblArea = new JLabel("Area");
                lblArea.setBounds(512, 19, 46, 14);
                panel.add(lblArea);
                
                comboArea = new JComboBox();
                comboArea.setBounds(602, 16, 153, 20);
                panel.add(comboArea);
                
                JLabel lblResponsable = new JLabel("Responsable");
                lblResponsable.setBounds(512, 46, 73, 14);
                panel.add(lblResponsable);
                
                comboResponsable = new JComboBox();
                comboResponsable.setBounds(602, 43, 153, 20);
                panel.add(comboResponsable);
                
                JButton btnBuscar = new JButton("Buscar");
                btnBuscar.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                                llenarTabla();
                        }
                });
                btnBuscar.setBounds(602, 68, 153, 23);
                panel.add(btnBuscar);
                
                JLabel label = new JLabel("Estado");
                label.setBounds(6, 72, 46, 14);
                panel.add(label);
                
                comboEstado = new JComboBox();
                comboEstado.setBounds(99, 69, 153, 20);
                panel.add(comboEstado);
                
                JPanel panel_1 = new JPanel();
                panel_1.setBorder(new TitledBorder(null, "Resultados de busqueda", TitledBorder.LEADING, TitledBorder.TOP, null, null));
                panel_1.setBounds(10, 133, 765, 247);
                contentPane.add(panel_1);
                panel_1.setLayout(null);
                
                JScrollPane scrollPane = new JScrollPane();
                scrollPane.addMouseListener(new MouseAdapter() {
                        @Override
                        public void mouseClicked(MouseEvent arg0) {
                        }
                });
                scrollPane.setBounds(10, 16, 748, 220);
                panel_1.add(scrollPane);
                
                table = new JTable(){
                        @Override
                        public boolean isCellEditable(int row, int colum)
                        {
                                return false;
                        }
                };
                table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                scrollPane.setViewportView(table);
                tm = new DefaultTableModel();
                table.setModel(tm);
                
                ArrayList<String> encabezado = new ArrayList<String>();
                encabezado.add("Codigo");
                encabezado.add("Curso");
                encabezado.add("Fecha de Inicio");
                encabezado.add("Horas");
                encabezado.add("Instructor");
                encabezado.add("Responsable");
                encabezado.add("Inscriptos");
                encabezado.add("Estado");
                
                tm.setColumnIdentifiers(encabezado.toArray());
                
                table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
                
                llenarCombos();
                llenarTabla();
            
                //funcion para centrar tabla.
                DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
                centerRenderer.setHorizontalAlignment(JLabel.CENTER);
                for(int i=0;i<table.getColumnCount();i++){
                    table.getColumnModel().getColumn(i).setCellRenderer(centerRenderer);
                   }
                
                JButton btnCrearNueva = new JButton("Crear Nueva");
                btnCrearNueva.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                if(cursadasCrear==null)
                                        cursadasCrear= new CursadasCrear(padreCursadas, usuario);
                                cursadasCrear.setVisible(true);
                        }
                });
                btnCrearNueva.setBounds(20, 391, 110, 23);
                contentPane.add(btnCrearNueva);
                
                JButton btnEditarCursada = new JButton("Asignar instructor");
                btnEditarCursada.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0) {
                        	if(table.getSelectedRow()!=-1)
            				{
	                        	if(asignarInstructor==null)
	                        		asignarInstructor=new AsignarInstructor(cursadas.get(table.getSelectedRow()),padreCursadas);
	                    		asignarInstructor.setVisible(true);
	                        }
		                	else
		                	{
		                		JOptionPane.showMessageDialog(contentPane, "No ha sido seleccionada ninguna cursada.", "Error!", JOptionPane.ERROR_MESSAGE);
		                	}   
                        }
                });
                
                btnEditarCursada.setBounds(257, 391, 122, 23);
                contentPane.add(btnEditarCursada);
                
                JButton btnExaminar = new JButton("Examinar");
                btnExaminar.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                        	if(table.getSelectedRow()!=-1)
            				{
                        		if(cursadasExaminar==null)
                                {
                        			cursadasExaminar = new CursadasExaminar(padreCursadas, cursadas.get(table.getSelectedRow()),usuario);
                                }
                                cursadasExaminar.setVisible(true);
            				}
    	                	else
    	                	{
    	                		JOptionPane.showMessageDialog(contentPane, "No ha sido seleccionada ninguna cursada.", "Error!", JOptionPane.ERROR_MESSAGE);
    	                	}   
                        }
                });
                
                JButton btnCrearClases = new JButton("Clases");
                btnCrearClases.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent arg0)
                        {
                        	if(table.getSelectedRow()!=-1)
    	                	{
                                if(clasesExaminar == null)
                                {
                                        clasesExaminar = new Clases(cursadas.get(table.getSelectedRow()),padreCursadas, usuario);
                                }
                                clasesExaminar.setVisible(true);
    	                	}
    	                	else
    	                	{
    	                		JOptionPane.showMessageDialog(contentPane, "No ha sido seleccionada ninguna cursada.", "Error!", JOptionPane.ERROR_MESSAGE);
    	                	}   
                        }
                });
                btnCrearClases.setBounds(139, 391, 110, 23);
                contentPane.add(btnCrearClases);
                btnExaminar.setBounds(389, 391, 122, 23);
                contentPane.add(btnExaminar);
                
                JButton btnReportarNotas = new JButton("Notas y examenes");
                btnReportarNotas.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                        	if(table.getSelectedRow()!=-1)
    	                	{
                        		if(notasYExamenes==null)
                                        notasYExamenes=new NotasYExamenes(padreCursadas, cursadas.get(table.getSelectedRow()));
                                notasYExamenes.setVisible(true);        
    	                	}
    	                	else
    	                	{
    	                		JOptionPane.showMessageDialog(contentPane, "No ha sido seleccionada ninguna cursada.", "Error!", JOptionPane.ERROR_MESSAGE);
    	                	}   
                        }
                });
                btnReportarNotas.setBounds(521, 391, 122, 23);
                contentPane.add(btnReportarNotas);
                
                JButton btnResponsable = new JButton("Responsable");
                btnResponsable.addActionListener(new ActionListener() {
                	public void actionPerformed(ActionEvent arg0) {
	                	if(table.getSelectedRow()!=-1)
	                	{
                			if(asignarResponsable==null)
	                			asignarResponsable=new AsignarResponsable(cursadas.get(table.getSelectedRow()),padreCursadas);
	                		asignarResponsable.setVisible(true);
                		}
	                	else
	                	{
	                		JOptionPane.showMessageDialog(contentPane, "No ha sido seleccionada ninguna cursada.", "Error!", JOptionPane.ERROR_MESSAGE);
	                	}
                	}
                });
                btnResponsable.setBounds(653, 391, 122, 23);
                contentPane.add(btnResponsable);
                
                JButton btnSalir = new JButton("Salir");
                btnSalir.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                dispose();
                        }
                });
                btnSalir.setBounds(653, 425, 122, 23);
                contentPane.add(btnSalir);
                
                if (cursadas.size()>0)
                {
                        table.changeSelection(0, 0, false, false);
                }
                else
                {
                        btnCrearClases.setVisible(false);
                        btnReportarNotas.setVisible(false);
                        btnReportarNotas.setVisible(false);                     
                }
                
                if(usuario.getPerfil().equals("Instructor"))
                {
                	btnCrearNueva.setVisible(false);
                	btnEditarCursada.setVisible(false);
                	btnResponsable.setVisible(false);
                	comboInstructores.setVisible(false);
                	lblInstructor.setVisible(false);
                	
                }
        }
        
        private void llenarCombos()
        {
                llenarComboInstructor();
                llenarComboArea();
                llenarComboCurso();
                llenarComboResponsable();
                llenarComboEstado();
        }
        
        private void llenarComboInstructor()
        {
                ArrayList<Usuario> instructores = UsuarioControlador.getInstructores();
                comboInstructores.removeAllItems();
                for(Usuario u : instructores)
                {
                        comboInstructores.addItem(u);
                }
                comboInstructores.insertItemAt("", 0);
                comboInstructores.setSelectedIndex(0);
        }
        
        private void llenarComboArea()
        {
                ArrayList<Area> areas = AreaControlador.getAll();
                comboArea.removeAllItems();
                for(Area a : areas)
                {
                        comboArea.addItem(a);
                }
                comboArea.insertItemAt("", 0);
                comboArea.setSelectedIndex(0);
        }
        
        private void llenarComboCurso()
        {
                ArrayList<Curso> cursos = CursoControlador.getAll();
                comboCurso.removeAllItems();
                for(Curso c : cursos)
                {
                        comboCurso.addItem(c);
                }
                comboCurso.insertItemAt("", 0);
                comboCurso.setSelectedIndex(0);
        }
        
        private void llenarComboResponsable()
        {
                ArrayList<Usuario> responsables = UsuarioControlador.getAdministrativosSupervisores();
                comboResponsable.removeAllItems();
                for(Usuario u : responsables)
                {
                	if(u.getNombre().compareToIgnoreCase("Sistema")!=0)
                        comboResponsable.addItem(u);
                }
                comboResponsable.insertItemAt("", 0);
                comboResponsable.setSelectedIndex(0);
        }
        
        public void llenarTabla()
        {
            tm.setRowCount(0);
            
            ArrayList <String> fila = new ArrayList<String>();
            
            cursadas = CursadaControlador.getAll();
          //  int i=1;
            for(Cursada c:cursadas)
            {
            //	System.out.println((c.getInstructor()==null) + " "+i);
            	//i++;
            }
            filtrarPorInstructor2(cursadas);
            
            filtrarPorCodigo(cursadas, txtCodigo.getText());
            filtrarPorInstructor(cursadas, comboInstructores);
            filtrarPorAlumno(cursadas, txtAlumno.getText());
            filtrarPorCurso(cursadas, comboCurso);
            filtrarPorArea(cursadas, comboArea);
            filtarPorResponsable(cursadas, comboResponsable);
            filtrarPorEstado(cursadas);
           
            
            for(Cursada c : cursadas)
                {
               	Integer inscriptos = InscripcionControlador.getInscriptos(c).size();
                Integer horas = c.getCurso().getHoras();
               	fila.add(c.getCodigo());
               	fila.add(c.getCurso().getNombre());
               	fila.add(c.getFechaInicio().toString());
               	fila.add(horas.toString());
               	if(c.getInstructor()==null)
               		fila.add("");
           		else
               		fila.add(c.getInstructor().toString());
               	
               	if(c.getUsuario()==null)
               		fila.add("");
           		else
               		fila.add(c.getUsuario().toString());
               	fila.add(inscriptos.toString());
               	fila.add(c.getEstado());
           	
           		tm.addRow(fila.toArray());
                fila.removeAll(fila);
                }
                table.setModel(tm);
                
                table.getColumnModel().getColumn(0).setPreferredWidth(60);
                table.getColumnModel().getColumn(0).setMinWidth(60);
                table.getColumnModel().getColumn(0).setMaxWidth(60);
                table.getColumnModel().getColumn(1).setPreferredWidth(130);
                table.getColumnModel().getColumn(1).setMinWidth(115);
                table.getColumnModel().getColumn(1).setMaxWidth(130);
                table.getColumnModel().getColumn(2).setPreferredWidth(85);
                table.getColumnModel().getColumn(2).setMinWidth(85);
                table.getColumnModel().getColumn(2).setMaxWidth(85);
                table.getColumnModel().getColumn(3).setPreferredWidth(59);
                table.getColumnModel().getColumn(3).setMinWidth(55);
                table.getColumnModel().getColumn(3).setMaxWidth(55);
                table.getColumnModel().getColumn(4).setPreferredWidth(140);
                table.getColumnModel().getColumn(4).setMinWidth(115);
                table.getColumnModel().getColumn(4).setMaxWidth(140);
                table.getColumnModel().getColumn(5).setPreferredWidth(140);
                table.getColumnModel().getColumn(5).setMinWidth(115);
                table.getColumnModel().getColumn(5).setMaxWidth(140);
                table.getColumnModel().getColumn(6).setPreferredWidth(65);
                table.getColumnModel().getColumn(6).setMinWidth(65);
                table.getColumnModel().getColumn(6).setMaxWidth(65);
                table.getColumnModel().getColumn(7).setPreferredWidth(70);
                table.getColumnModel().getColumn(7).setMinWidth(70);
                table.getColumnModel().getColumn(7).setMaxWidth(70);
        }
            
        private void filtarPorResponsable(ArrayList<Cursada> cursadas, JComboBox comboResponsable) 
        {
        	if(comboResponsable.getSelectedIndex()==0)
            {
        		return;
            }
            else
            {
            	Usuario usuario = (Usuario) comboResponsable.getSelectedItem();
                for(int i = 0; i<cursadas.size();)
                {
                	if(!cursadas.get(i).getUsuario().equals(usuario))
                    {
                		cursadas.remove(i);
                    }
                    else
                    	i++;
                }
            }
        }
        
        private void filtrarPorInstructor2(ArrayList<Cursada> cursadas)
        {
        	if(usuario.getPerfil().equals("Instructor"))
        	{
        		
	        	for(int i=0; i<cursadas.size();)
	        	{
	        		
	        		if (cursadas.get(i).getInstructor()==null || !cursadas.get(i).getInstructor().getDni().equals(usuario.getDni()))
	        			{
	        				cursadas.remove(i);        			
	        			}
	        		else
	        		{
	        			i++;
	        		}
	        		
	        	}
        	}
        }

        private void filtrarPorArea(ArrayList<Cursada> cursadas, JComboBox comboArea) 
        {
        	if(comboArea.getSelectedIndex()==0)
                    {
                            return;
                    }
                    else
                    {
                            Area area = (Area) comboArea.getSelectedItem();
                            for(int i = 0; i<cursadas.size();)
                            {
                                    if(!(cursadas.get(i).getCurso().getArea().getId() == area.getId()))
                                    {
                                            cursadas.remove(i);
                                    }
                                    else
                                            i++;
                            }
                    }
            }

        private void filtrarPorCurso(ArrayList<Cursada> cursadas, JComboBox comboCurso) 
            {
                    if(comboCurso.getSelectedIndex()==0)
                    {
                            return;
                    }
                    else
                    {
                            Curso curso = (Curso) comboCurso.getSelectedItem();
                            for(int i = 0; i<cursadas.size();)
                            {
                                    if(!cursadas.get(i).getCurso().getNombre().equals(curso.getNombre()))
                                    {
                                            cursadas.remove(i);
                                    }
                                    else
                                            i++;
                            }
                    }
            }

        private void filtrarPorAlumno(ArrayList<Cursada> cursadas, String dni) 
            {
                    if(dni.equals(""))
                    {
                            return;
                    }
                    
                    else
                    {       
                            String dniAlumno = dni;
                            for(int i = 0;i<cursadas.size();)
                            {
                                    boolean borro = false;
                                    ArrayList<Inscripcion> inscriptosCursada = InscripcionControlador.getInscriptos(cursadas.get(i));
                                    
                                    for(Inscripcion ins : inscriptosCursada)
                                    {
                                            if(!ins.getAlumno().getDni().equals(dniAlumno))
                                            {
                                                    cursadas.remove(i);
                                                    borro = true;
                                                    break;
                                            }
                                    }
                                    if(!borro)
                                    {
                                            i++;
                                    }
                            }
                    }
            }

        private void filtrarPorInstructor(ArrayList<Cursada> cursadas, JComboBox comboInstructores) 
            {
                    if(comboInstructores.getSelectedIndex()==0)
                    {
                            return;
                    }
                    else
                    {
                            Usuario instructor = (Usuario) comboInstructores.getSelectedItem();
                            for(int i = 0; i<cursadas.size();)
                            {
                            	
                            	if(cursadas.get(i).getInstructor()!=null)
                            	{
                                    if(!(cursadas.get(i).getInstructor().getDni().equals(instructor.getDni())))
                                    {
                                            cursadas.remove(i);
                                    }       
                                    else
                                             i++;
                            	}
                            	else
                            	{
                            		cursadas.remove(i);
                            		i++;
                            	}
                            }
                    }
            }

        private void filtrarPorCodigo(ArrayList<Cursada> cursadas, String txtCodigo) 
            {
                    if(txtCodigo.equals(""))
                    {
                            return;
                    }
                    
                    else
                    {       
                            String codigoCursada = txtCodigo;
                            for(int i = 0;i<cursadas.size();)
                            {
                                    if(!cursadas.get(i).getCodigo().equals(codigoCursada))
                                    {
                                            cursadas.remove(i);
                                    }
                                    else
                                            i++;
                            }
                    }
            }
        
        public void llenarComboEstado()
        {
        	comboEstado.addItem("Inscripcion");
        	comboEstado.addItem("Iniciada");
        	comboEstado.addItem("Cancelada");
        	comboEstado.setSelectedIndex(-1);
        }
        
        public void filtrarPorEstado(ArrayList<Cursada> cursadas)
        {
        	if(comboEstado.getSelectedIndex()!=-1)
        	{
	        	for (int i=0; i<cursadas.size();)
	        	{
	        		if (!cursadas.get(i).getEstado().equals(comboEstado.getSelectedItem()))
	        			cursadas.remove(i);
	        		else
	        			i++;
	        	}
        	}
        	
        }

		
    }